package Key_Value类型

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object aggregateByKey {
    /*
     1. 作用：在kv对的RDD中，，按key将value进行分组合并，合并时，将每个value和初始值作为seq函数的参数，进行计算，返回的结果作为一个新的kv对，然后再将结果按照key进行合并，最后将每个分组的value传递给combine函数进行计算（先将前两个value进行计算，将返回结果和下一个value传给combine函数，以此类推），将key与计算结果作为一个新的kv对输出。
     2. 参数描述：
    （1）zeroValue：给每一个分区中的每一个key一个初始值；
    （2）seqOp：函数用于在每一个分区中用初始值逐步迭代value；
    （3）combOp：函数用于合并每个分区中的结果。
    */

    def main(args: Array[String]): Unit = {

        val config: SparkConf = new SparkConf().setMaster("local[*]").setAppName("WordCount")

        val sc = new SparkContext(config)

        val rdd = sc.parallelize(List(("a", 3), ("a", 2), ("c", 4), ("b", 3), ("c", 6), ("c", 8)), 2)

        //        取出每个分区相同key对应值的最大值，然后相加
        val res = rdd.aggregateByKey(0)(math.max, _ + _)

        res.collect().foreach(println)
    }

}
